     /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.prod.mbean;

import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.ParametroDto;
import com.brain.core.exception.DAOException;
import com.brain.core.manager.BitacoraManager;
import com.brain.core.manager.ParametroManager;
import com.brain.core.manager.RecursosManager;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.ArchivoMBean;
import com.brain.core.view.mbean.GenericMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.prod.dto.MaquinaCostoDto;
import com.brain.prod.dto.MaquinaDto;
import com.brain.prod.dto.MaquinaMantDto;
import com.brain.prod.dto.MaquinaPerDto;
import com.brain.prod.dto.OpMantenimientoDto;
import com.brain.prod.dto.TipoMaquinaDto;
import com.brain.prod.manager.MaquinaCostoManager;
import com.brain.prod.manager.MaquinaManager;
import com.brain.prod.manager.MaquinaMantManager;
import com.brain.prod.manager.MaquinaPerManager;
import com.brain.prod.manager.OpMantenimientoManager;
import com.brain.prod.manager.TipoMaquinaManager;
import com.brain.prod.view.util.ConstantesProd;
import java.io.Serializable;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 * @author Greip Company
 * @since 09/01/2014
 * @version 1.0
 */
@Controller("maquinaMBean")
@Scope("session")
public class MaquinaMBean extends GenericMBean implements Serializable {

    /**
     * Logger permite registrar los errores que ocurren
     * @since 09/01/2014
     */
    private static Logger logger = Logger.getLogger(MaquinaMBean.class);
    
    /**
     * manager: comunica a la vista con la capa de negocio de la entidad MaquinaDto
     * @since 10/01/2014
     */
    @Resource
    private MaquinaManager manager;
    
    /**
     * costoManager: comunica a la vista con la capa de negocio de la entidad MaquinaCostoDto
     * @since 10/01/2014
     */
    @Resource
    private MaquinaCostoManager costoManager;
    
    /**
     * mantManager: comunica a la vista con la capa de negocio de la entidad MaquinaMantDto
     * @since 10/01/2014
     */
    @Resource
    private MaquinaMantManager mantManager;
    
    /**
     * perManager: comunica a la vista con la capa de negocio de la entidad MaquinaPerDto
     * @since 10/01/2014
     */
    @Resource
    private MaquinaPerManager perManager;
    
    /**
     * applicationMBean permite obtener diferentes valores de la aplicación, como acciones y estilos
     * @since 09/01/2014
     */
    @Autowired
    private ApplicationMBean applicationMBean;
    
    /**
     * sessionMBean: contiene información del usuario, asi como las acciones que se realizan sobre la entidad
     * @since 10/01/2014
     */
    @Autowired
    private SessionMBean sessionMBean;
    
    /**
     * recursosManager permite mostrar mensajes en las vistas
     * @since 09/01/2014
     */
    @Resource
    private RecursosManager recursosManager;
    
    /**
     * bitacoraManager: permite desplegar un popup con las acciones que se realizaron sobre la entidad
     * @since 10/01/2014
     */
    @Resource
    private BitacoraManager bitacoraManager;   
    
    @Resource
    private ArchivoMBean archivoMBean;
    
    /**
     * lista: almacena el listado de registros de la entidad MaquinaDto. Usada en la vista listaMaquina.xhtml
     * @since 10/01/2014
     */
    private List<MaquinaDto> lista;
    
    /**
     * dto: almacena los datos provenientes de la vista maquina.xhtml
     * @since 10/01/2014
     */
    private MaquinaDto dto;
    
    /**
     * dtoFiltro: almacena los datos provenientes de la vista listaMaquina.xhtml
     * @since 10/01/2014
     */
    private MaquinaDto dtoFiltro;
    
    /**
     * detaCostoDto: almacena los datos provenientes del popup maquinaCosto.xhtml
     * @since 10/01/2014
     */
    private MaquinaCostoDto detaCostoDto;
    
    /**
     * detaMantDto: almacena los datos provenientes del popup maquinaMant.xhtml
     * @since 10/01/2014
     */
    private MaquinaMantDto detaMantDto;
    
    /**
     * detaPerDto: almacena los datos provenientes del popup maquinaPer.xhtml
     * @since 10/01/2014
     */
    private MaquinaPerDto detaPerDto;
    
    /**
     * keyTitulo: titulo de la entidad MaquinaDto usado en los paneles
     * @since 10/01/2014
     */
    private String keyTitulo = "form.maquina.panel";
    
    /**
     * keyDetalle: titulo de la entidad detalle, usado en los paneles de los detalles
     * @since 10/01/2014
     */
    private String keyDetalle = "key.entidad.maquina";
    
    /**
     * tituloDetalle: titulo de la entidad detalle, usado en los paneles de los detalles
     * @since 10/01/2014
     */
    private String tituloDetalle;
    
    /**
     * listaTipoMaquina: almacena un listado de la entidad TipoMaquinaDto para ser mostrado en un combo
     * @since 10/01/2014
     */
    private List<TipoMaquinaDto> listaTipoMaquina;
    
    /**
     * listaUMCosto: almacena un listado de la entidad ParametroDto para ser mostrado en un combo
     * @since 10/01/2014
     */
    private List<ParametroDto> listaUMCosto;
    
    /**
     * listaTipoMant: almacena un listado de la entidad ParametroDto para ser mostrado en un combo
     * @since 10/01/2014
     */
    private List<ParametroDto> listaTipoMant;
    
    /**
     * listaOpMant: almacena un listado de la entidad OpMantenimientoDto para ser mostrado en un combo
     * @since 10/01/2014
     */
    private List<OpMantenimientoDto> listaOpMant;
    
    /**
     * listaTipoPer: almacena un listado de la entidad ParametroDto para ser mostrado en un combo
     * @since 10/01/2014
     */
    private List<ParametroDto> listaTipoPer;
    
    /**
     * listaTurnos: almacena un combo de turnos
     * @since 10/01/2014
     */
    private SelectItem[] listaTurnos;
    
    /**
     * listaDiaSemana: almacena un combo de los dias de la semana
     * @since 10/01/2014
     */
    private SelectItem[] listaDiaSemana;

    /**
     * iniciar(): inicializa las variable dtoFiltro y lista
     * @return retorna la dirección de la vista listaMaquina.xhtml
     */
    public String iniciar() {
        this.dtoFiltro = new MaquinaDto();        
        this.dtoFiltro.setDescripcion("");
        this.dtoFiltro.setDescripcionCorta("");
        this.dtoFiltro.setEstado(Boolean.TRUE);
        this.lista = null;
        return this.manager.getUrlLista();
    }

    /**
     * buscar(ae): realiza la búsqueda de registros de la entidad MaquinaDto y lo asigna a la variable lista
     * @param ae por defecto null
     */
    public void buscar(ActionEvent ae) {
        try {
            this.lista = this.manager.obtenerMaquina(this.dtoFiltro);
        } catch (DAOException ex) {
            logger.error(ex);
        }
    }

    /**
     * nuevo(): setea la accion a nuevo, crea el titulo del panel entidad e inicializa las entidades
     * @since 10/01/2014
     * @return retorna la dirección de la vista Maquina.xhtml
     */
    public String nuevo() {

        sessionMBean.setAccion(applicationMBean.getNuevo());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.dto = this.manager.inicializar();
        this.detaCostoDto = this.costoManager.inicializar();
        this.detaMantDto = this.mantManager.inicializar();
        this.detaPerDto = this.perManager.inicializar();
        return this.manager.getUrl();
    }
    
    /**
     * nuevoCosto(): setea la accionDetalle a nuevo, crea el titulo del panel entidadDetalle e inicializa la entidad detalle.
     * Asigna a la entidad detalle la referencia de la entidad padre
     * @since 10/01/2014
     */
    public void nuevoCosto() {
        sessionMBean.setAccionDetalle(applicationMBean.getNuevo());
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalle, sessionMBean.getAccionDetalle());
        this.detaCostoDto = this.costoManager.inicializar();
        this.detaCostoDto.setMaquinaDto(this.dto);
    }
    
    /**
     * nuevoMant(): setea la accionDetalle a nuevo, crea el titulo del panel entidadDetalle e inicializa la entidad detalle.
     * Asigna a la entidad detalle la referencia de la entidad padre
     * @since 10/01/2014
     */
    public void nuevoMant() {
        sessionMBean.setAccionDetalle(applicationMBean.getNuevo());
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalle, sessionMBean.getAccionDetalle());
        this.detaMantDto = this.mantManager.inicializar();
        this.detaMantDto.setMaquinaDto(this.dto);
    }
    
    /**
     * nuevoPer(): setea la accionDetalle a nuevo, crea el titulo del panel entidadDetalle e inicializa la entidad detalle.
     * Asigna a la entidad detalle la referencia de la entidad padre
     * @since 10/01/2014
     */
    public void nuevoPer() {
        sessionMBean.setAccionDetalle(applicationMBean.getNuevo());
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalle, sessionMBean.getAccionDetalle());
        this.detaPerDto = this.perManager.inicializar();
        this.detaPerDto.setMaquinaMantDto(this.detaMantDto);
        System.out.println(sessionMBean.getAccionDetalle());
        
    }

    /**
     * editar(): setea la accion a editar, crea el titulo del panel de la entidad e inicializa las entidades detalle
     * @since 10/01/2014
     * @return retorna la direccion de la vista Maquina.xhtml
     */
    public String editar() {
        sessionMBean.setAccion(applicationMBean.getEditar());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.detaCostoDto = this.costoManager.inicializar();
        this.detaMantDto = this.mantManager.inicializar();
        this.detaPerDto = this.perManager.inicializar();
        return this.manager.getUrl();
    }
    
    /**
     * editarCosto(): setea la accionDetalle a editar, crea el titulo del panel de la entidad detalle y obtiene la entidadDetalle
     * @since 10/01/2014
     */
    public void editarCosto() {
        sessionMBean.setAccionDetalle(applicationMBean.getEditar());
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalle, sessionMBean.getAccionDetalle());
        if (this.detaCostoDto.getId() != null) {
            try {
                this.detaCostoDto = this.costoManager.obtenerPorId(this.detaCostoDto.getId());
            } catch (DAOException e) {
                showError(e.getMessage());
                logger.error(e);
            }
        }
    }
    
    /**
     * editarMant(): setea la accionDetalle a editar, crea el titulo del panel de la entidad detalle y obtiene la entidadDetalle
     * @since 10/01/2014
     */
    public void editarMant() {
        sessionMBean.setAccionDetalle(applicationMBean.getEditar());
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalle, sessionMBean.getAccionDetalle());
        if (this.detaMantDto.getId() != null) {
            try {
                this.detaMantDto = this.mantManager.obtenerPorId(this.detaMantDto.getId());
            } catch (DAOException e) {
                showError(e.getMessage());
                logger.error(e);
            }
        }
    }
    
    /**
     * editarPer(): setea la accionDetalle a editar, crea el titulo del panel de la entidad detalle y obtiene la entidadDetalle
     * @since 10/01/2014
     */
    public void editarPer() {
        sessionMBean.setAccionDetalle(applicationMBean.getEditar());
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalle, sessionMBean.getAccionDetalle());
        if (this.detaPerDto.getId() != null) {
            try {
                this.detaPerDto = this.perManager.obtenerPorId(this.detaPerDto.getId());
            } catch (DAOException e) {
                showError(e.getMessage());
                logger.error(e);
            }
        }
    }
    
    /**
     * ver(): setea la accion a ver, crea el titulo del panel de la entidad e inicializa las entidades detalle
     * @since 10/01/2014
     * @return retorna la dirección de la vista maquina.xhtml
     */
    public String ver() {
        sessionMBean.setAccion(applicationMBean.getVer());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.detaCostoDto = this.costoManager.inicializar();
        this.detaMantDto = this.mantManager.inicializar();
        this.detaPerDto = this.perManager.inicializar();
        return this.manager.getUrl();
    }
    
    /**
     * verCosto(): setea la accionDetalle a ver, crea el titulo del panel de la entidad detalle y obtiene la entidad detalle
     * @since 10/01/2014
     */
    public void verCosto() {
        sessionMBean.setAccionDetalle(applicationMBean.getVer());
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalle, sessionMBean.getAccionDetalle());
        if (this.detaCostoDto.getId() != null) {
            try {
                this.detaCostoDto = this.costoManager.obtenerPorId(this.detaCostoDto.getId());
            } catch (DAOException e) {
                showError(e.getMessage());
                logger.error(e);
            }
        }
    }
    
    /**
     * verMant(): setea la accionDetalle a ver, crea el titulo del panel de la entidad detalle y obtiene la entidad detalle
     * @since 10/01/2014
     */
    public void verMant() {
        sessionMBean.setAccionDetalle(applicationMBean.getVer());
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalle, sessionMBean.getAccionDetalle());
        if (this.detaMantDto.getId() != null) {
            try {
                this.detaMantDto = this.mantManager.obtenerPorId(this.detaMantDto.getId());
            } catch (DAOException e) {
                showError(e.getMessage());
                logger.error(e);
            }
        }
    }
    
    /**
     * verPer(): setea la accionDetalle a ver, crea el titulo del panel de la entidad detalle y obtiene la entidad detalle
     * @since 10/01/2014
     */
    public void verPer() {
        sessionMBean.setAccionDetalle(applicationMBean.getVer());
        this.tituloDetalle = recursosManager.construirTitulo(keyDetalle, sessionMBean.getAccionDetalle());
        if (this.detaPerDto.getId() != null) {
            try {
                this.detaPerDto = this.perManager.obtenerPorId(this.detaPerDto.getId());
            } catch (DAOException e) {
                showError(e.getMessage());
                logger.error(e);
            }
        }
    }
    
    /**
     * Metodo guardar() se encarga de guardar la entidad MaquinaDto y devuelve null como valor de cadena
     * @since 10/01/2014
     * @return retorna null como valor de cadena
     */
    public String guardar() {        
        if (this.manager.guardar(this.dto) != null) {            
            this.editar();
        }        
        return null;
    }
    
    /**
     * guardarCosto(): permite guardar la entidad MaquinaCostoDto; a la vez, obtiene la entidad MaquinaDto
     * @since 10/01/2014
     */
    public void guardarCosto() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        try {
            if (this.costoManager.guardar(detaCostoDto) != null) {
                this.dto = this.manager.obtenerPorId(this.dto.getId());
            }
            else {
                resultado = false;
            }
        } catch (DAOException e) {
            showError("ERROR_SISTEMA", e.getMessage());
            logger.error(e);
        }
        context.addCallbackParam("CallbackParam", resultado);
    }
    
    /**
     * guardarMant(): permite guardar la entidad MaquinaMantDto; a la vez, obtiene la entidad MaquinaDto
     * @since 10/01/2014
     */
    public void guardarMant() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        try {
            if (this.mantManager.guardar(detaMantDto) != null) {
                this.dto = this.manager.obtenerPorId(this.dto.getId());
            }
            else {
                resultado = false;
            }
        } catch (DAOException e) {
            showError("ERROR_SISTEMA", e.getMessage());
            logger.error(e);
        }
        context.addCallbackParam("CallbackParam", resultado);
    }
    
    /**
     * guardarPer(): permite guardar la entidad MaquinaPerDto; a la vez, obtiene la entidad MaquinaDto
     * @since 10/01/2014
     */
    public void guardarPer() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        try {
            if (this.perManager.guardar(detaPerDto) != null) {
                this.detaMantDto = this.mantManager.obtenerPorId(this.detaMantDto.getId());
            }
            else {
                resultado = false;
            }
        } catch (DAOException e) {
            showError("ERROR_SISTEMA", e.getMessage());
            logger.error(e);
        }
        context.addCallbackParam("CallbackParam", resultado);
    }
    
    /**
     * verBitacora(): muestra un listado de las acciones realizadas sobre la entidad
     * @since 10/01/2014
     * @return retorna null
     */
    public String verBitacora() {
        bitacoraManager.cargarBitacoraEntidad(manager.getIdEntidad(), this.dto.getId());
        return null;
    }

    /**
     * retroceder(): retorna a la pagina listaMaquina.xhtml mostrando el listado de todos los registros
     * @since 10/01/2014
     * @return retorna la dirección de la vista listaMaquina.xhtml
     */
    public String retroceder() {
        buscar(null);
        return this.manager.getUrlLista();
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public MaquinaDto getDto() {
        return dto;
    }

    public void setDto(MaquinaDto dto) {
        this.dto = dto;
    }

    public MaquinaDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(MaquinaDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public String getKeyTitulo() {
        return keyTitulo;
    }

    public void setKeyTitulo(String keyTitulo) {
        this.keyTitulo = keyTitulo;
    }

    public List<MaquinaDto> getLista() {
        return lista;
    }

    public void setLista(List<MaquinaDto> lista) {
        this.lista = lista;
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        MaquinaMBean.logger = logger;
    }  

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }
    
    public ArchivoMBean getArchivoMBean() {
        return archivoMBean;
    }

    public void setArchivoMBean(ArchivoMBean archivoMBean) {
        this.archivoMBean = archivoMBean;
    }

    public MaquinaManager getManager() {
        return manager;
    }

    public void setManager(MaquinaManager manager) {
        this.manager = manager;
    }

    public BitacoraManager getBitacoraManager() {
        return bitacoraManager;
    }

    public void setBitacoraManager(BitacoraManager bitacoraManager) {
        this.bitacoraManager = bitacoraManager;
    }

    public String getKeyDetalle() {
        return keyDetalle;
    }

    public void setKeyDetalle(String keyDetalle) {
        this.keyDetalle = keyDetalle;
    }

    public String getTituloDetalle() {
        return tituloDetalle;
    }

    public void setTituloDetalle(String tituloDetalle) {
        this.tituloDetalle = tituloDetalle;
    }

    public MaquinaCostoDto getDetaCostoDto() {
        return detaCostoDto;
    }

    public void setDetaCostoDto(MaquinaCostoDto detaCostoDto) {
        this.detaCostoDto = detaCostoDto;
    }

    public MaquinaCostoManager getCostoManager() {
        return costoManager;
    }

    public void setCostoManager(MaquinaCostoManager costoManager) {
        this.costoManager = costoManager;
    }

    public List<TipoMaquinaDto> getListaTipoMaquina() throws DAOException{
        TipoMaquinaManager tipoMaquinaManager = (TipoMaquinaManager) WebServletContextListener.getApplicationContext().getBean("tipoMaquinaManager");
        this.listaTipoMaquina = tipoMaquinaManager.obtenerActivos();
        return this.listaTipoMaquina;
    }

    public void setListaTipoMaquina(List<TipoMaquinaDto> listaTipoMaquina) {
        this.listaTipoMaquina = listaTipoMaquina;
    }

    public MaquinaMantDto getDetaMantDto() {
        return detaMantDto;
    }

    public void setDetaMantDto(MaquinaMantDto detaMantDto) {
        this.detaMantDto = detaMantDto;
    }

    public MaquinaMantManager getMantManager() {
        return mantManager;
    }

    public void setMantManager(MaquinaMantManager mantManager) {
        this.mantManager = mantManager;
    }

    public List<ParametroDto> getListaUMCosto() throws DAOException{
        ParametroManager parametroManager = (ParametroManager) WebServletContextListener.getApplicationContext().getBean("parametroManager");
        this.listaUMCosto = parametroManager.obtenerParametrosActivosPorCatalogoSistema(ConstantesProd.CatalogoParametro.TIPO_MANTENIMIENTO);
        return this.listaUMCosto;
    }

    public void setListaUMCosto(List<ParametroDto> listaUMCosto) {
        this.listaUMCosto = listaUMCosto;
    }

    public List<ParametroDto> getListaTipoMant() throws DAOException{
        ParametroManager parametroManager = (ParametroManager) WebServletContextListener.getApplicationContext().getBean("parametroManager");
        this.listaTipoMant = parametroManager.obtenerParametrosActivosPorCatalogoSistema(ConstantesProd.CatalogoParametro.TIPO_MANTENIMIENTO);
        return this.listaTipoMant;
    }

    public void setListaTipoMant(List<ParametroDto> listaTipoMant) {
        this.listaTipoMant = listaTipoMant;
    }

    public List<OpMantenimientoDto> getListaOpMant() throws DAOException{
        OpMantenimientoManager opMantenimientoManager = (OpMantenimientoManager) WebServletContextListener.getApplicationContext().getBean("opMantenimientoManager");
        this.listaOpMant = opMantenimientoManager.obtenerActivos();
        return this.listaOpMant;
    }

    public void setListaOpMant(List<OpMantenimientoDto> listaOpMant) {
        this.listaOpMant = listaOpMant;
    }

    public MaquinaPerManager getPerManager() {
        return perManager;
    }

    public void setPerManager(MaquinaPerManager perManager) {
        this.perManager = perManager;
    }

    public MaquinaPerDto getDetaPerDto() {
        return detaPerDto;
    }

    public void setDetaPerDto(MaquinaPerDto detaPerDto) {
        this.detaPerDto = detaPerDto;
    }

    public List<ParametroDto> getListaTipoPer() throws DAOException{
        ParametroManager parametroManager = (ParametroManager) WebServletContextListener.getApplicationContext().getBean("parametroManager");
        this.listaTipoPer = parametroManager.obtenerParametrosActivosPorCatalogoSistema(ConstantesProd.CatalogoParametro.TIPO_MANTENIMIENTO);
        return this.listaTipoPer;
    }

    public void setListaTipoPer(List<ParametroDto> listaTipoPer) {
        this.listaTipoPer = listaTipoPer;
    }

    public SelectItem[] getListaTurnos() {
        this.listaTurnos = this.manager.getListaTurnos();
        return this.listaTurnos;
    }

    public void setListaTurnos(SelectItem[] listaTurnos) {
        this.listaTurnos = listaTurnos;
    }

    public SelectItem[] getListaDiaSemana() {
        this.listaDiaSemana = this.perManager.getListaDiaSemana();
        return this.listaDiaSemana;
    }

    public void setListaDiaSemana(SelectItem[] listaDiaSemana) {
        this.listaDiaSemana = listaDiaSemana;
    }
}
